/**
 * 抽象共厂
 * 其实是实现了一个子类继承父类的方法，这个方法需要传递子类以及需要继承的父类
 */ 
var VechicleFactory = function(subType, superType){
  // 判断工厂中是否有该抽象类
  if(typeof VechicleFactory[superType] === 'function'){
    // 缓存类
    function F(){};
    //继承父类的属性和方法
    F.prototype = new VechicleFactory[superType]();  // 这怎么做是不仅要继承父类的原型 同时也要继承父类的属性,如果直接继承的话就会所有的子类公用同一个属性
    // 将子类的constructor指向子类
    subType.constructor =subType;
    // 子类原型继承父类
    subType.prototype = new F();
  }else{
    throw new Error('未创建该抽象类')
  }
}

//小汽车抽象类
VechicleFactory.Car = function(){
  this.type = 'Car'
}

VechicleFactory.Car.prototype = {
  getPrice: function(){
    return new Error('该抽象方法不能调用')
  },
  getSpeed: function(){
    return new Error('该抽象方法不能调用')
  }
}

// 公共汽车抽象类
VechicleFactory.Bus = function(){
  this.type = 'Bus'
}

VechicleFactory.Bus.prototype = {
  getPrice: function(){
    return new Error('该抽象方法不能调用')
  },
  getPersonNum: function(){
    return new Error('该抽象方法不能调用')
  }
}

// 宝马汽车子类
var BMW = function(price,speed){
  this.price = price;
  this.speed = speed;
}
// 抽象工厂实现对类的继承
VechicleFactory(BMW, 'Car')
BMW.prototype.getPrice = function(){
  return this.price;
}
BMW.prototype.getSpeed = function(){
  return this.speed;
}

var baoma = new BMW('100000','180km')
console.log(baoma.getPrice())
console.log(baoma.getSpeed())

